home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
utilmus
/
mp_v3.lha
/
mpo.s
< prev
Wrap
Text File
|
1996-04-26
|
13KB
|
698 lines
EXECBASE =4
OPENLIB =-408
CLOSELIB =-414
OPEN =-30
CLOSE =-36
READ =-42
WRITE =-48
ALLOCMEM =-198
FREEMEM =-210
EXAMINE =-102
LOCK =-84
UNLOCK =-90
bra MAIN_PARA
dc.b '$VER: MultiPlayer (MP) V2.1 D.W & M.O.N Music Player.',$0
;
; MultiPlayer V2.1 David Whittaker & Maniacs Of Noise Player.
; Bug Update...
MAIN_PARA:
MOVEM.L D0-D7/A0-A6,-(A7)
BSR INITIALISE
BSR BODY
BSR TERMINATE
MOVEM.L (A7)+,D0-D7/A0-A6
move.l #0,d0 ; no error return code.
RTS
INITIALISE:
MOVE.L A0,SAVECOMM
BSR OPENDOS
CMP.W #0,(ERRORFLAG)
BEQ I1
RTS
I1: BSR OPENSCREEN
CMP.W #0,(ERRORFLAG)
BEQ I2
BSR CLOSEDOS
I2: RTS
BODY:
CMP.W #0,(ERRORFLAG) ; ANY ERRORS ?
BEQ B1 ; OKAY, PERFORM THE BODY
RTS ; OK, QUIT TO THE TERMINATE PARA.
B1: BSR GETPARAMS ; SEE WHAT PARAMETERS ARE GIVEN
CMP.W #0,(ERRORFLAG) ; NO PARAMETERS GIVEN
BEQ DISPLAYHELP ; EXIT WITH USAGE DISPLAY
CMP.W #1,(ERRORFLAG) ; ONLY FILENAME
BEQ B2 ; CHECK, ALLOC, LOAD AND PLAY.
CMP.W #2,(ERRORFLAG) ; FILENAME AND SONGNO GIVEN
BEQ B3 ; CHECK, ALLOC, LOAD AND PLAY SONG.
CMP.W #3,(ERRORFLAG) ; CHANGE SONG.
BEQ B4 ; CHECKPLAYER, CHANGE SONG.
CMP.W #9,(ERRORFLAG)
BEQ B9
RTS
DISPLAYHELP:
LEA HELP,A0
BSR PRINT
RTS
B2:
BSR CHECK ; CHECK FOR ALREADY PLAYING MOD AND FILE.
CMP.W #1,(ERRORFLAG) ; MP ALREADY PRESENT, UNLOAD.
BEQ B2A ; AND REPEAT LOADING PROCESS.
CMP.W #2,(ERRORFLAG) ; UNKNOWN PRG. USING $6C
BEQ QUITT
B2B: BSR ALLOC
CMP.W #1,(ERRORFLAG)
BEQ ALLOCATIONPROB
BSR LOAD
CMP.W #1,(ERRORFLAG)
BEQ OUT
BSR PLAY
RTS
B2A:
BSR STOP
BSR UNALLOC
BRA B2
B3:
BSR CHECK ; CHECK FOR ALREADY PLAYING MOD AND FILE.
CMP.W #0,(ERRORFLAG) ; MP ALREADY PRESENT, UNLOAD.
BEQ B3A ; AND REPEAT LOADING PROCESS.
CMP.W #2,(ERRORFLAG) ; UNKNOWN PRG. USING $6C
BEQ QUITT
BSR CHANGESONG
RTS
B3A:
LEA NOTHINGPLAYING,A0
BSR PRINT
RTS
B4:
BSR STOP
CMP.W #0,(ERRORFLAG)
BNE QUITT
BSR UNALLOC
RTS
B9:
LEA BADCOMMAND,A0
BSR PRINT
QUITT: RTS
TERMINATE:
BSR CLOSESCREEN
BSR CLOSEDOS
RTS
;*******************************************************************
HELP: DC.B 'MPlayer - V2.1 by D.Gibbs Bug Update (c)1994-5.',$A,$D
DC.B '©David Whittaker/Maniacs-Of-Noise Player.',$a,$d,$d
DC.B 'Usage:',$A,$D
DC.B 'Load - MP -L <song> <song-no>',$A,$D
DC.B 'Change Song - MP -S <song-no>',$A,$D
DC.B 'Quit - MP -Q',$A,$D,0
NOTHINGPLAYING:
DC.B 'No songs playing.',$A,$D,0
;********************************************************************
OPENDOS:
MOVE.W #0,(ERRORFLAG)
LEA DOSNAME,A1 ; LIBRARY NAME TO OPEN
MOVEQ #0,D0 ; ANY VERSION
MOVE.L EXECBASE,A6 ; USE EXEC.LIBRARY
JSR OPENLIB(A6) ; OPEN THE LIBRARY
MOVE.L D0,DOSBASE ; SAVE DOS BASE
BEQ OPENOSERROR ; ERROR
RTS
OPENOSERROR:
MOVE.W #1,(ERRORFLAG)
RTS
OPENSCREEN:
MOVE.W #0,(ERRORFLAG)
MOVE.L #CONSOLENAME,D1 ; NAME (*) THE CLI SCREEN
MOVE.L #1005,D2 ; OPEN OLD
MOVE.L DOSBASE,A6 ; THE DOSLIBRARY
JSR OPEN(A6) ; "OPEN" THE CON SCREEN
MOVE.L D0,CONHANDLE ; SAVE CON ADDRESS
BEQ OPENSCREENERROR ; ERROR FOUND
RTS
OPENSCREENERROR:
MOVE.W #1,(ERRORFLAG)
RTS
CLOSESCREEN:
MOVE.L CONHANDLE,D1 ; GET CON ADDRESS
MOVE.L DOSBASE,A6 ; USE DOSLIBRARY
JSR CLOSE(A6) ; "CLOSE" THE CON SCREEN
RTS
CLOSEDOS:
MOVE.L DOSBASE,A1 ; GET DOSBASE
MOVE.L EXECBASE,A6 ; USE EXEC.LIBRARY
JSR CLOSELIB(A6) ; CLOSE DOS LIBRARY
RTS
;****************************************************************
DOSNAME: DC.B 'dos.library',0
DOSBASE: DC.L 0
CONSOLENAME: DC.B '*',0
CONHANDLE: DC.L 0
ERRORFLAG: DC.W 0
;****************************************************************
GETPARAMS:
MOVE.W #0,(ERRORFLAG)
MOVE.L SAVECOMM,A0
CMP.B #$A,(A0)
BEQ OUT
CMP.B #'-',(A0)+
BEQ COMMAND
MOVE.W #9,(ERRORFLAG)
OUT: RTS
COMMAND:
BCLR #5,(A0)
CMP.B #'E',(A0)
BEQ QUIETMODE
CMP.B #'L',(A0)
BEQ CLOAD
CMP.B #'S',(A0)
BEQ CCS
CMP.B #'Q',(A0)
BEQ UNLOAD_R
RTS
QUIETMODE:
MOVE.B #1,QM
CLOAD:
MOVE.L #0,SONGSTART
ADD.L #1,A0
CMP.B #32,(A0)+
BNE XTRAPARAM
MOVE.L #FILENAME,A1
CL1: CMP.B #$A,(A0)
BEQ CL22
CMP.B #32,(A0)
BEQ CL1A
MOVE.B (A0)+,(A1)+
BRA CL1
CL1A:
MOVE.B #0,(A1)
ADD.L #1,A0
CMP.B #$A,1(A0)
BNE XPE
CLR.L D0
MOVE.B (A0),D0
SUB.L #48,D0
CMP.L #9,D0
BGT OOR
MOVE.L D0,SONGSTART
CL2: MOVE.W #1,(ERRORFLAG)
RTS
CL22:
MOVE.B #0,(A1)
BRA CL2
XPE: ; LOAD : XTRA PARAMTER ERROR
MOVE.L #0,SONGSTART
LEA XPI,A0
BSR PRINT
BRA CL2
OOR: ; LOAD : OUT-OF-RANGE
MOVE.L #0,SONGSTART
LEA OORT,A0
BSR PRINT
BRA CL2
CCS: ; CHANGE THE SONG
ADD.L #1,A0
CMP.B #32,(A0)
BNE XTRAPARAM
ADD.L #1,A0
CMP.B #$A,1(A0)
BNE CXPE
CLR.L D0
MOVE.B (A0),D0
SUB.L #48,D0
CMP.L #9,D0
BGT COOR
cmp.l #0,d0
blt COOR
MOVE.L D0,SONGSTART
MOVE.W #2,(ERRORFLAG)
RTS
CXPE: ; CHANGE : EXTRA PARAM ERROR
MOVE.W #2,(ERRORFLAG)
MOVE.L #0,SONGSTART
LEA XPI,A0
BSR PRINT
BRA CCCS
COOR: ; CHANGE : OUT OF RANGE
MOVE.W #2,(ERRORFLAG)
MOVE.L #0,SONGSTART
LEA OORT,A0
BSR PRINT
CCCS: RTS
UNLOAD_R:
MOVE.W #3,(ERRORFLAG)
RTS
XTRAPARAM:
LEA NEED_XTRA_PARAM,A0
BSR PRINT
MOVE.W #99,(ERRORFLAG)
RTS
;*********************************************************************
SONGSTART: DC.L 0
SAVECOMM: DC.L 0
BADCOMMAND: DC.B 'Bad or Unknown Command.',$A,$D,0
NEED_XTRA_PARAM: DC.B 'Sorry, extra parameter required.',$a,$d,0
XPI: DC.B 'Extra Paramter Ignored.',$A,$D,0
OORT: DC.B 'Number out of range, number ignored.',$A,$D,0
;*********************************************************************
CHECK:
MOVE.W #0,(ERRORFLAG)
MOVE.L $6C,A0
CMP.L #$F00000,A0
BGT MPR2
ADD.L #$4,A0
CMP.L #'MP21',(A0)+
BEQ MPROUTINE
LEA UNKNOWNROUT,A0
BSR PRINT
MOVE.W #2,(ERRORFLAG)
RTS
MPROUTINE:
MOVE.L (A0),MODULETYPE
MOVE.W #1,(ERRORFLAG)
MPR2:
MOVE.L #FILENAME,D1
MOVE.L #-2,D2
MOVE.L DOSBASE,A6
JSR LOCK(A6)
MOVE.L D0,LOCKHANDLE
BEQ FILE_NOT_FOUND
MOVE.L LOCKHANDLE,D1
MOVE.L #FILEINFO,D2
MOVE.L DOSBASE,A6
JSR EXAMINE(A6)
BEQ FILE_EXAMINE_ERROR
MOVE.L LOCKHANDLE,D1
MOVE.L DOSBASE,A6
JSR UNLOCK(A6)
LEA FILEINFO,A0
MOVE.L 124(A0),FILESIZE
MOVE.L FILESIZE,D0
CMP.L #$C8000,D0
BGT FIXFILESIZE
RTS
FIXFILESIZE:
MOVE.L 122(A0),FILESIZE
RTS
FILE_NOT_FOUND:
LEA FILENAME,A0
BSR PRINT
LEA FNF,A0
LAB1: BSR PRINT
MOVE.W #2,(ERRORFLAG)
RTS
FILE_EXAMINE_ERROR:
LEA FEE,A0
BRA LAB1
***********************************************************
LOCKHANDLE: DC.L 0
FILESIZE: DC.L 0
FILEINFO: DS.B 260
MODULETYPE: DC.B '----'
FILENAME: DS.B 32
UNKNOWNROUT: DC.B 'Something is using Interrupt 3, program aborted.'
DC.B $A,$D,0
FNF: DC.B 'File not found.',$A,$D,0
FEE: DC.B 'Unable to examine file, program aborted.',$A,$D,0
;***********************************************************
ALLOC:
MOVE.W #0,(ERRORFLAG)
MOVE.L FILESIZE,$150020
MOVE.L #INT_END-INT_ST,D0 ; SIZE OF INT ROUTINE
MOVE.L #1,D1 ; ALLOC PUBLIC (FAST OR CHIP)
MOVE.L EXECBASE,A6
JSR ALLOCMEM(A6)
MOVE.L D0,INT_START
BEQ ALLOC_PROBLEM1
MOVE.L #INT_END-INT_ST,INT_SIZE
MOVE.L FILESIZE,D0 ; SIZE OF MODULE
MOVE.L #2,D1 ; ALLOC (CHIP)
MOVE.L EXECBASE,A6
JSR ALLOCMEM(A6)
MOVE.L D0,MOD_START
BEQ ALLOC_PROBLEM2
MOVE.L FILESIZE,MOD_SIZE
RTS
ALLOC_PROBLEM1:
MOVE.W #1,(ERRORFLAG)
RTS
ALLOC_PROBLEM2:
LEA AP2,A0
BSR PRINT
MOVE.L INT_START,D0
MOVE.L INT_SIZE,D1
MOVE.L EXECBASE,A6
JSR FREEMEM(A6)
BRA ALLOC_PROBLEM1
ALLOCATIONPROB:
LEA APM,A0
BSR PRINT
RTS
;*************************************************************8
INT_START: DC.L 0
APM: DC.B 'Not enough memory available for interrupt routine.',$A,$D,0
AP2: DC.B 'Not enough CHIP memory for music module available.',$A,$D,0
; DC.B 0
;*************************************************************8
UNALLOC:
MOVE.L INT_START,A1
MOVE.L INT_SIZE,D0
MOVE.L EXECBASE,A6
JSR FREEMEM(A6)
TST.L D0
BEQ UAE1
REP1:
MOVE.L MOD_START,A1
MOVE.L MOD_SIZE,D0
MOVE.L EXECBASE,A6
JSR FREEMEM(A6)
TST.L D0
BEQ UAE2
RTS
UAE1:
LEA UAE1T,A0
BSR PRINT
BRA REP1
UAE2:
LEA UAE2T,A0
BSR PRINT
RTS
;*************************************************************
UAE1T: DC.B 'Cannot UnAllocate Interrupt routine.',$A,$D,0
UAE2T: DC.B 'Cannot UnAllocate Module!!',$A,$D,0
;*************************************************************
LOAD:
MOVE.W #0,(ERRORFLAG)
MOVE.L #FILENAME,D1
MOVE.L #1005,D2
MOVE.L DOSBASE,A6
JSR OPEN(A6)
MOVE.L D0,FILEHANDLE
BEQ UNABLE_TO_OPEN_FILE
MOVE.L FILEHANDLE,D1
MOVE.L MOD_START,D2
MOVE.L #4,D3
MOVE.L DOSBASE,A6
JSR READ(A6)
BEQ READ_ERROR
MOVE.L MOD_START,A0
MOVE.W MON_ID,D0
MOVE.L DW_ID,D1
CMP.W (A0),D0
BEQ LOAD_MON
CMP.L (A0),D1
BEQ LOAD_DW
LEA UNREC,A0
BSR PRINT
MOVE.W #1,(ERRORFLAG)
RTS
LOAD_MON:
LEA LOADING_MON,A0
BSR PRINT
MOVE.L #'MON.',D0
MOVE.L D0,MOD_T
BRA CONT_LOAD
LOAD_DW:
LEA LOADING_DW,A0
BSR PRINT
MOVE.L #'D.W.',D0
MOVE.L D0,MOD_T
BRA CONT_LOAD
CONT_LOAD:
MOVE.L FILEHANDLE,D1
MOVE.L MOD_START,D2
ADD.L #4,D2
MOVE.L FILESIZE,D3
SUB.L #4,D3
MOVE.L DOSBASE,A6
JSR READ(A6)
BEQ READ_ERROR
LOAD_CLOSE:
MOVE.L FILEHANDLE,D1
MOVE.L DOSBASE,A6
JSR CLOSE(A6)
LEA LOADED,A0
BSR PRINT
RTS
UNABLE_TO_OPEN_FILE:
MOVE.W #1,(ERRORFLAG)
LEA UTOF,A0
BSR PRINT
RTS
READ_ERROR:
MOVE.W #1,(ERRORFLAG)
LEA RE,A0
BSR PRINT
RTS
;*************************************************************
FILEHANDLE: DC.L 0
UTOF: DC.B 'Unable to open module file.',$A,$D,0
RE: DC.B 'Error while reading file.',$A,$D,0
UNREC: DC.B 'Unrecognised music format, loading aborted.',$A,$D,0
LOADING_MON: DC.B 'Maniacs-Of-Noise music file detected, loading...',0
LOADING_DW: DC.B 'David Whittaker music file detected, loading...',0
LOADED: DC.B 'Loaded.',$A,$D,0
DC.B 0
DW_ID: DC.B $48,$E7,$F1,$FE
MON_ID: DC.B $4E,$FA ;$00,$2E
;*************************************************************
PLAY:
LEA MOD_T,A0
CMP.L #'MON.',(A0)
BEQ PLAY_MON
LEA MOD_T,A0
CMP.L #'D.W.',(A0)
BEQ PLAY_DW
LEA SYSTEM_FALIURE,A0
BSR PRINT
BSR UNALLOC
MOVE.W #1,(ERRORFLAG)
RTS
PLAY_IT:
MOVE.L $6C,A1
MOVE.L #INTJ,A0
MOVE.L A1,2(A0)
MOVE.L #INT_ST,A0
MOVE.L INT_START,A1
MOVE.L #INT_END-INT_ST,D0
PL1: MOVE.B (A0)+,(A1)+
DBRA D0,PL1
MOVE.L INT_START,A1
MOVE.L A1,$6C
RTS
PLAY_MON:
LEA INTOS,A0
MOVE.W #$4,2(A0)
CLR.L D1
MOVE.L #0,D0
MOVE.L MOD_START,A0
JSR 0(A0)
MOVE.L SONGSTART,D0
ADD.L #1,D0
MOVE.L #0,D1
MOVE.L MOD_START,A0
JSR 8(A0)
MOVE.B #2,$BFE001
BRA PLAY_IT
PLAY_DW:
LEA INTOS,A0
MOVE.W #$E,2(A0)
MOVE.L SONGSTART,D0
MOVE.L MOD_START,A0
JSR 0(A0)
BRA PLAY_IT
;*****************************************************
SYSTEM_FALIURE: DC.B 'recoverable system error has occured.',$A,$D,0
;*****************************************************
CHANGESONG:
MOVE.W #0,(ERRORFLAG)
MOVE.L $6C,A1
ADD.L #$8,A1
MOVE.L (A1),MOD_T
LEA MOD_T,A0
CMP.L #'MON.',(A0)
BEQ CHANGE_MON
LEA MOD_T,A0
CMP.L #'D.W.',(A0)
BEQ CHANGE_DW
LEA SYSTEM_FALIURE,A0
BSR PRINT
MOVE.W #1,(ERRORFLAG)
RTS
CHANGE_MON:
MOVE.L $6C,A0
ADD.L #$2A,A0
MOVE.L (A0),MOD_START
CLR.L D1
MOVE.L #0,D0
MOVE.L MOD_START,A0
JSR 0(A0)
MOVE.L SONGSTART,D0
ADD.L #1,D0
MOVE.L #0,D1
MOVE.L MOD_START,A0
JSR 8(A0)
MOVE.B #2,$BFE001
RTS
CHANGE_DW:
MOVE.L $6C,A0
ADD.L #$2A,A0
MOVE.L (A0),A0
MOVE.L SONGSTART,D0
JSR 0(A0)
RTS
;*****************************************************
STOP:
MOVE.W #0,(ERRORFLAG)
MOVE.L $6C,A1
MOVE.L A1,INT_START
MOVE.L $2A(A1),MOD_START
MOVE.L $2E(A1),MOD_SIZE
MOVE.L $32(A1),INT_SIZE
MOVE.L MOD_START,$150000
MOVE.L MOD_SIZE,$150004
MOVE.L INT_START,$150008
MOVE.L INT_SIZE,$15000C
ADD.L #$8,A1
CMP.L #'D.W.',(A1)
BEQ OFF_DW
CMP.L #'MON.',(A1)
BEQ OFF_MON
LEA UNKNOWN,A0
BSR PRINT
MOVE.W #9,(ERRORFLAG)
RTS
OFF_DW:
MOVE.L MOD_START,A0
JSR $1C(A0)
MOVE.L INT_START,A1
MOVE.L $26(A1),A0
MOVE.L A0,$6C
RTS
OFF_MON:
MOVE.L MOD_START,A0
CLR.L D1
MOVE.L #0,D0
MOVE.L MOD_START,A0
JSR 0(A0)
MOVE.L #0,D0
MOVE.L #0,D1
MOVE.L MOD_START,A0
JSR 8(A0)
MOVE.L INT_START,A1
MOVE.L $26(A1),A0
MOVE.L A0,$6C
RTS
;*****************************************************
QM: DC.B 0,0
UNKNOWN: DC.B 'Unknown Music Module Format',$a,$d
DC.B 'not a David Whittaker or ',$a,$d
DC.B 'Maniacs Of Noise music module.',$A,$D,0
;*****************************************************
even
PRINT:
CMP.B #1,QM
BEQ QMON
MOVEM.L D0-D7/A0-A6,-(A7) ; SAVE REGISTERS
MOVE.L A0,A1 ; BACK UP PRINT ADDRESS
MOVE.L #0,D0 ; RESET COUNTER
P1: CMP.B #0,(A0)+ ; CHECK FOR NULL TERMINATOR
BEQ P2 ; IF FOUND PRINT
ADD.L #1,D0 ; ELSE ADD 1 TO COUNTER
BRA P1 ; LOOP AROUND
P2: MOVE.L CONHANDLE,D1 ;
MOVE.L A1,D2 ; MOVE BACKUP TO START
MOVE.L D0,D3 ; SIZE OF STRING
MOVE.L DOSBASE,A6 ; USE DOS.LIBRARY
JSR WRITE(A6) ; PRINT
MOVEM.L (A7)+,D0-D7/A0-A6 ; RETURN REGISTERS
QMON: RTS ; EXIT TO CALLING ROUTINE
;***************************************************************
INT_ST:
BRA INT1
DC.B 'MP21' ; ROUTINUE NAME (MP10) MP V2.1
MOD_T: DC.B '----' ; SONG TYPE (MON./D.W.)
INT1:
MOVEM.L D0-D7/A0-A6,-(A7)
MOVE.L MOD_START(PC),A6
INTOS: JSR 0(A6)
MOVE.W #$2000,$DFF09C
MOVEM.L (A7)+,D0-D7/A0-A6
INTJ: JMP $0
MOD_START:
DC.L 0
MOD_SIZE:
DC.L 0
INT_SIZE:
DC.L 0
INT_END:
; **************************************************************